<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="./styles_main.css" />
<title>Frequently Asked Questions</title>
</head><body>

<ul class="primary-links">
  <li><a href="./index.html">Intro and tutorial</a></li>
  <li><a href="./snippet-organization.html">Howto: organize</a></li>
  <li><a href="./snippet-expansion.html">Howto: expand</a></li>
  <li><a href="./snippet-development.html">Howto: write</a></li>
  <li><a href="./snippet-menu.html">Howto: menu</a></li>
  <li><a href="./faq.html">FAQ</a></li>
  <li><a href="http://yasnippet.googlecode.com/svn/trunk/doc/changelog.html">ChangeLog</a></li>
  <li><a href="http://code.google.com/p/yasnippet/downloads/list">Download</a></li>
</ul>

<p class="original">原文： <a href="http://yasnippet.googlecode.com/svn/trunk/doc/faq.html">http://yasnippet.googlecode.com/svn/trunk/doc/faq.html</a>
<span class="translated-date">(translated on 2010/Dec/21)</span>
<a class="link-to-editors-room" href="http://code.google.com/p/yasnippet-doc-jp/">⇒ 翻訳プロジェクト</a>
</p>

<h1>Frequently Asked Questions</h1>

<p class="notice"><strong>〔重要〕</strong> このドキュメントは YASnippet の <strong>SVN trunk</strong> に対して適用されるものです。
SVN trunk は<a href="http://code.google.com/p/yasnippet/source/checkout">こちら</a>から取得できます。
他のバージョンに対するドキュメントは<a href="から取得できます。">こちら</a>で見られます。
</p>

<ul class="toc">
  <li><a href="#id1">余計な改行がついてしまう</a></li>
  <li><a href="#id2">TAB キーでスニペットを展開できない</a></li>
  <li><a href="#id3">flyspell と一緒に使うと TAB キーによる操作ができない</a></li>
  <li><a href="#id4">あるバッファで YASnippet マイナーモードを OFF にしたい</a></li>
  <li><a href="#id5">ファイルシステムでサポートされていない文字を snippet key に使いたい</a></li>
</ul>

<div class="contents">

<h2 id="id1">余計な改行がついてしまう</h2>

<p>スニペット定義ファイルの末尾に改行がある場合、YASnippet はスニペットを展開したときに改行を追加します。
もしそうしたくない場合は、スニペット定義ファイルを保存するときにその末尾に改行を追加しないようにしてください。
</p>

<p>一部のエディタは自動的に改行を追加することに注意してください。
Emacs の場合、変数 <code>require-final-newline</code> を <code>t</code> に設定していると、自動的にファイルの末尾に改行が追加されます。
</p>


<h2 id="id2">TAB キーでスニペットを展開できない</h2>

<p>まず最初に、モード行に <code>yas</code> と表示されているか確認してください。
もし表示されていない場合、YASnippet のマイナーモードを手動で ON にするために <code>M-x yas/minor-mode</code> を実行してみて、それからもう一度 TAB キーで展開できないか試してみてください。
もしこれでうまくいったら、あなたの <code>.emacs</code> で YASnippet を読み込んでいるところ<em>より前に</em>、以下のコードを追加してください：
</p>

<div class="highlight"><pre>(add-hook &#39;the-major-mode-hook &#39;yas/minor-mode-on)
</pre></div>

<p>上記コードの &quot;<code>the-major-mode</code>&quot; のところは、（<code>yas/minor-mode</code> がデフォルトで有効にならなかった）メジャーモードの名前にしてください。
</p>

<p>YASnippet のバージョン 0.6 以降では、YASnippet が<em>すべての</em>メジャーモードに対して自動的に有効になるようにするために、
コマンド <code>M-x yas/global-mode</code> を使うことができます。
</p>

<p>次に、<code>yas/minor-mode</code> が有効なのにスニペットが展開できない、というケースについて考えます。
まず、TAB キーに割り当てられているコマンドを確認してみましょう。
<code>C-h k</code> を入力して、続けて TAB キーを押してみてください。
Emacs が結果を表示してくれるはずです。
</p>

<p>おそらく Emacs は <code>TAB runs the command ...</code> というプロンプトを表示するハズです。
あるいは、<code>&lt;tab&gt; runs the command ...</code> かもしれません。
&quot;<code>TAB</code>&quot; と &quot;<code>&lt;tab&gt;</code>&quot; の違いは、後者のほうが優先度が高い、というだけです。
もし、<code>yas/expand</code> 以外のコマンドが &quot;<code>&lt;tab&gt;</code>&quot; に割り当てられていた場合、
以下の回避策をお試しください（これは <code>org-mode</code> の例です）：
</p>

<div class="highlight"><pre>(add-hook &#39;org-mode-hook
          (let ((original-command (lookup-key org-mode-map [tab])))
            `(lambda ()
               (setq yas/fallback-behavior
                     &#39;(apply ,original-command))
               (local-set-key [tab] &#39;yas/expand))))
</pre></div>

<p>上記の例の <code>org-mode-hook</code> と <code>org-mode-map</code> のところは、適当なメジャーモードの名前に置き換えてください
（あなたが今なんという名前のメジャーモードにいるのか確認するには、<code>C-h m</code> を使ってください）。
</p>

<p>別の回避策として、以下のコードも試してみてください：
</p>

<div class="highlight"><pre>(defun yas/advise-indent-function (function-symbol)
  (eval `(defadvice ,function-symbol (around yas/try-expand-first activate)
           ,(format
             &quot;Try to expand a snippet before point, then call `%s&#39; as usual&quot;
             function-symbol)
           (let ((yas/fallback-behavior nil))
             (unless (and (interactive-p)
                          (yas/expand))
               ad-do-it)))))

(yas/advise-indent-function &#39;ruby-indent-line)
</pre></div>

<p class="not-sure">TAB キーに割り当てられている「そのメジャーモード固有の」インデント関数（上記の例では <code>ruby-indent-line</code>）を<em>アドバイス</em>するため、
最初に <code>yas/expand</code> を試みます。
</p>

<p>もし、<code>C-h k RET &lt;tab&gt;</code> の結果では TAB キーは確かに <code>yas/expand</code> に割り当てられているのに YASnippet が機能しない場合、
あなたの設定を確認してください。
また、<a href="http://groups.google.com/group/smart-snippet">discussion group</a> に助けを求めるのも手かもしれません。
いくつかの素晴らしい解決方法については<a href="http://code.google.com/p/yasnippet/issues/detail?id=93&can=1">このスレッド</a>を参照してください。
</p>

<p>TAB に割り当てられているコマンドに関する情報と、モードの情報（<code>C-h m</code> で得られます）を、忘れずに添付するようにしてください。
</p>

<h2 id="id3">flyspell と一緒に使うと TAB キーによる操作ができない</h2>

<p>（訳注： flyspell というのはリアルタイムのスペルチェッカです）
</p>

<p>回避策は、スニペットがアクティブになっている間は flyspell によるオーバーレイを無効にする、というものです：
</p>

<div class="highlight"><pre>(add-hook &#39;flyspell-incorrect-hook
        #&#39;(lambda (dummy1 dummy2 dymmy3)
            (and yas/active-field-overlay
                 (overlay-buffer yas/active-field-overlay))))
</pre></div>

<p>この問題は、どうやら、オーバーレイの優先度に関係あるようです。
なんらかの理由により、flyspell のオーバーレイの <code>keymap</code> プロパティは、YASnippet のオーバーレイの <code>keymap</code> より常に優先されるようです。
たとえ YASnippet のほうの <code>priority</code> プロパティを大きな値に設定したとしても、ダメです。
もし、あなたが emacs-lisp について知識があって、この問題を解決できるなら、<a href="http://groups.google.com/group/smart-snippet">discussion group</a> に一筆書いてください。
</p>

<h2 id="id4">あるバッファで YASnippet マイナーモードを OFF にしたい</h2>

<p>YASnippet のバージョン 0.6.1c 以降なら、一番良い方法は、変数 <code>yas/dont-activate</code> のデフォルト値を以下のようなラムダ関数にすることです：
</p>

<div class="highlight"><pre>(set-default &#39;yas/dont-activate
           #&#39;(lambda ()
               (and yas/root-directory
                    (null (yas/get-snippet-tables)))))
</pre></div>

<p class="not-sure">これはまた、バージョン 0.6.1c 以降でのデフォルト値でもあります。
こうすると、<code>yas/root-directory</code> が設定されていて、かつ、そのバッファに適用可能な snippet table が存在しないときに限り、YASnippet マイナーモードをスキップします。
</p>

<h2 id="id5">ファイルシステムでサポートされていない文字を snippet key に使いたい</h2>

<p><strong>注：</strong>
この質問は、ファイル名が snippet key になるようにスニペットを定義しているときだけ適用されます。
この挙動は、YASnippet のバージョン 0.6 より古いバージョンに対する後方互換性を提供するためのもので、非推奨です（将来のバージョンでは廃止されるかもしれません）。
</p>

<p>たとえば、文字 <code>&gt;</code> をキーとするスニペットを定義したいとします。
この文字は、Windows 上のファイル名として使える文字ではありません。
つまり、ファイル名を trigger key として使うことができません。
</p>

<p>スニペットを定義するときに明示的に snippet key を指定できる <code># key:</code> ディレクティブを使うべきです。
そして、そのスニペット定義を、任意の妥当なファイル名（たとえば <code>lt.yasnippet</code>）で保存してください。
</p>

<div class="highlight"><pre>#key: &lt;
#name: &lt;...&gt;&lt;/...&gt;
# --
&lt;${1:div}&gt;$0&lt;/$1&gt;
</pre></div>

</div><!-- class="contents" -->

</body></html>
